001    /*
002     *  Copyright 2001-2005 Stephen Colebourne
003     *
004     *  Licensed under the Apache License, Version 2.0 (the "License");
005     *  you may not use this file except in compliance with the License.
006     *  You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     *  Unless required by applicable law or agreed to in writing, software
011     *  distributed under the License is distributed on an "AS IS" BASIS,
012     *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     *  See the License for the specific language governing permissions and
014     *  limitations under the License.
015     */
016    package org.joda.time;
017    
018    /**
019     * Defines an exact duration of time in milliseconds.
020     * <p>
021     * The implementation of this interface may be mutable or immutable. This
022     * interface only gives access to retrieve data, never to change it.
023     * <p>
024     * Methods that are passed a duration as a parameter will treat <code>null</code>
025     * as a zero length duration.
026     *
027     * @see ReadableInterval
028     * @see ReadablePeriod
029     * @author Brian S O'Neill
030     * @author Stephen Colebourne
031     * @since 1.0
032     */
033    public interface ReadableDuration extends Comparable {
034    
035        /**
036         * Gets the total length of this duration in milliseconds.
037         *
038         * @return the total length of the time duration in milliseconds.
039         */
040        long getMillis();
041    
042        //-----------------------------------------------------------------------
043        /**
044         * Get this duration as an immutable <code>Duration</code> object.
045         * <p>
046         * This will either typecast this instance, or create a new <code>Duration</code>.
047         * 
048         * @return a Duration created using the millisecond duration from this instance
049         */
050        Duration toDuration();
051    
052        //-----------------------------------------------------------------------
053        /**
054         * Converts this duration to a Period instance using the standard period type
055         * and the ISO chronology.
056         * <p>
057         * Only precise fields in the period type will be used. Thus, only the hour,
058         * minute, second and millisecond fields on the period will be used.
059         * The year, month, week and day fields will not be populated.
060         * <p>
061         * If the duration is small, less than one day, then this method will perform
062         * as you might expect and split the fields evenly.
063         * If the duration is larger than one day then all the remaining duration will
064         * be stored in the largest available field, hours in this case.
065         * <p>
066         * For example, a duration effectively equal to (365 + 60 + 5) days will be
067         * converted to ((365 + 60 + 5) * 24) hours by this constructor.
068         * <p>
069         * For more control over the conversion process, you must pair the duration with
070         * an instant, see {@link Period#Period(ReadableInstant,ReadableDuration)}.
071         * 
072         * @return a Period created using the millisecond duration from this instance
073         */
074        Period toPeriod();
075    
076        //-----------------------------------------------------------------------
077        /**
078         * Compares this duration with the specified duration based on length.
079         *
080         * @param obj  a duration to check against
081         * @return negative value if this is less, 0 if equal, or positive value if greater
082         * @throws NullPointerException if the object is null
083         * @throws ClassCastException if the given object is not supported
084         */
085        int compareTo(Object obj);
086    
087        /**
088         * Is the length of this duration equal to the duration passed in.
089         *
090         * @param duration  another duration to compare to, null means zero milliseconds
091         * @return true if this duration is equal to than the duration passed in
092         */
093        boolean isEqual(ReadableDuration duration);
094    
095        /**
096         * Is the length of this duration longer than the duration passed in.
097         *
098         * @param duration  another duration to compare to, null means zero milliseconds
099         * @return true if this duration is equal to than the duration passed in
100         */
101        boolean isLongerThan(ReadableDuration duration);
102    
103        /**
104         * Is the length of this duration shorter than the duration passed in.
105         *
106         * @param duration  another duration to compare to, null means zero milliseconds
107         * @return true if this duration is equal to than the duration passed in
108         */
109        boolean isShorterThan(ReadableDuration duration);
110    
111        //-----------------------------------------------------------------------
112        /**
113         * Compares this object with the specified object for equality based
114         * on the millisecond length. All ReadableDuration instances are accepted.
115         *
116         * @param readableDuration  a readable duration to check against
117         * @return true if the length of the duration is equal
118         */
119        boolean equals(Object readableDuration);
120    
121        /**
122         * Gets a hash code for the duration that is compatable with the 
123         * equals method.
124         * The following formula must be used:
125         * <pre>
126         *  long len = getMillis();
127         *  return (int) (len ^ (len >>> 32));
128         * </pre>
129         *
130         * @return a hash code
131         */
132        int hashCode();
133    
134        //-----------------------------------------------------------------------
135        /**
136         * Gets the value as a String in the ISO8601 duration format using hours,
137         * minutes and seconds (including fractional milliseconds).
138         * <p>
139         * For example, "PT6H3M7S" represents 6 hours, 3 minutes, 7 seconds.
140         *
141         * @return the value as an ISO8601 string
142         */
143        String toString();
144    
145    }